package com.smart.community.commons.enums;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

import lombok.Getter;

/**
 * 性别枚举
 * 统一管理性别相关的常量
 * @author Wu.Liang
 * @since 2025-01-30
 * @version 1.0.0
 */
@Getter
public enum GenderEnum {
    
    /**
     * 未知
     */
    UNKNOWN(0, "未知"),
    
    /**
     * 男
     */
    MALE(1, "男"),
    
    /**
     * 女
     */
    FEMALE(2, "女");
    
    @JsonValue
    private final Integer code;
    private final String name;
    
    /**
     * 构造函数
     * 
     * @param code 性别代码
     * @param name 性别名称
     */
    GenderEnum(Integer code, String name) {
        this.code = code;
        this.name = name;
    }
    
    /**
     * 根据代码获取枚举
     * 
     * @param code 性别代码
     * @return 性别枚举
     */
    public static GenderEnum getByCode(Integer code) {
        if (code == null) {
            return UNKNOWN;
        }
        for (GenderEnum gender : values()) {
            if (gender.getCode().equals(code)) {
                return gender;
            }
        }
        return UNKNOWN;
    }
    
    /**
     * 根据名称获取枚举
     * 
     * @param name 性别名称
     * @return 性别枚举
     */
    public static GenderEnum getByName(String name) {
        if (name == null) {
            return UNKNOWN;
        }
        for (GenderEnum gender : values()) {
            if (gender.getName().equals(name)) {
                return gender;
            }
        }
        return UNKNOWN;
    }
    
    /**
     * 获取性别名称
     * 
     * @param code 性别代码
     * @return 性别名称
     */
    public static String getNameByCode(Integer code) {
        return getByCode(code).getName();
    }
    
    /**
     * 检查是否为有效性别代码
     * 
     * @param code 性别代码
     * @return 是否为有效性别代码
     */
    public static boolean isValidCode(Integer code) {
        if (code == null) {
            return false;
        }
        for (GenderEnum gender : values()) {
            if (gender.getCode().equals(code)) {
                return true;
            }
        }
        return false;
    }
    
    /**
     * Jackson反序列化方法
     * 严格遵循《系统状态枚举权威标准声明.md》规范
     * 
     * @param code 枚举值
     * @return 对应的枚举，如果不存在则返回UNKNOWN
     */
    @JsonCreator
    public static GenderEnum fromCode(Integer code) {
        return getByCode(code);
    }
}
